﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace WindowsFormsApplication1
{
    public partial class Sinónimos : Form
    {

        OracleCommand comando;
        OracleDataReader datos;
        NpgsqlCommand comandopsg;
        NpgsqlDataReader datospsg;
        int last_value;
        public Sinónimos()
        {
            InitializeComponent();
        }

        private void enable_controls()
        {
            lbl_actualizando.Visible = false;
            this.Refresh();
        }

        private void disable_controls()
        {
            lbl_actualizando.Visible = true;
            this.Refresh();
        }

        private void rellenar_tipo_s()
        {
            try
            {

                int r;
                int v;
                r = dgv_mine.RowCount - 2;
                while (r >= 0)
                {
                    v = Convert.ToInt32(dgv_mine.Rows[r].Cells[5].Value.ToString());
                    if (v >= 0)
                    {
                        dgv_mine.Rows[r].Cells[6].Value = "Ascendente";
                    }
                    else
                    {
                        dgv_mine.Rows[r].Cells[6].Value = "Descendente";
                    }
                    r--;
                }

                r = dgv_foreign.RowCount - 1;
                while (r >= 0)
                {
                    v = Convert.ToInt32(dgv_foreign.Rows[r].Cells[5].Value.ToString());
                    if (v >= 0)
                    {
                        dgv_foreign.Rows[r].Cells[6].Value = "Ascendente";
                    }
                    else
                    {
                        dgv_foreign.Rows[r].Cells[6].Value = "Descendente";
                    }
                    r--;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
       }


        public void Cargar_sinseqproc(Int16 tipo)
        {
            try
            {
                dgv_foreign.Rows.Clear();
                dgv_foreign.Columns.Clear();

                dgv_mine.Rows.Clear();
                dgv_mine.Columns.Clear();

                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
               

                String sentenciamine = "", sentenciaforeign = "";
                int i = 0, j, columnas;
                if (tipo == 0)
                {
                        sentenciaforeign = "select synonym_name nombre, owner dueño, table_name objeto_referencia from all_synonyms where owner <> '" + frm_login.user + "'";
                        sentenciamine = "select synonym_name nombre, owner dueño, table_name objeto_referencia from all_synonyms where owner = '" + frm_login.user + "'";
                }
                else if (tipo == 1)
                {
                    if (frm_login.oracle)
                    {
                    sentenciaforeign = "select sequence_name nombre, sequence_owner dueño, min_value Min, max_value Max, last_number Actual, increment_by intervalo from all_sequences where sequence_owner <> '" + frm_login.user + "'";
                    sentenciamine = "select sequence_name nombre, sequence_owner dueño, min_value Min, max_value Max, last_number Actual, increment_by intervalo from all_sequences where sequence_owner = '" + frm_login.user + "'";
                    }
                    else
                    {
                        sentenciaforeign = "SELECT sequence_name nombre, sequence_schema dueño, minimum_value Min, maximum_value Max, \"increment\" intervalo FROM information_schema.sequences where sequence_schema <> '" + frm_login.user + "'";
                        sentenciamine = "SELECT sequence_name nombre, sequence_schema dueño, minimum_value Min, maximum_value Max, \"increment\" intervalo FROM information_schema.sequences where sequence_schema = '" + frm_login.user + "'";
                    }
                }
                else
                {
                    if (frm_login.oracle)
                    {
                        sentenciaforeign = "select a.object_name nombre, a.owner dueño, o.status from all_procedures a, all_objects o where o.object_name = a.object_name and a.owner <> '" + frm_login.user + "'";
                        sentenciamine = "select a.object_name nombre, a.owner dueño, o.status from all_procedures a, all_objects o where o.object_name = a.object_name and a.owner = '" + frm_login.user + "'";
                    }
                    else
                    {
                        sentenciaforeign = "SELECT p.proname nombre, u.usename dueño, p.prosrc codigo FROM pg_catalog.pg_proc p, pg_catalog.pg_user u WHERE p.proowner = u.usesysid AND u.usename <> '" + frm_login.user + "'";
                        sentenciamine = "SELECT p.proname nombre, u.usename dueño, p.prosrc codigo FROM pg_catalog.pg_proc p, pg_catalog.pg_user u WHERE p.proowner = u.usesysid AND u.usename = '" + frm_login.user + "'";
                    }
                    dgv_mine.ReadOnly = true;
                    dgv_foreign.AllowUserToAddRows = false;
                    dgv_foreign.AllowUserToDeleteRows = false;
                    dgv_mine.AllowUserToAddRows = false;
                    dgv_mine.AllowUserToDeleteRows = false;
                }

                if (frm_login.oracle)
                {
                    comando = new OracleCommand(sentenciamine, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_mine.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_mine.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }
                    i = 0;
                    comando = new OracleCommand(sentenciaforeign, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_foreign.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_foreign.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }
                }
                else
                {
                    comandopsg = new NpgsqlCommand(sentenciamine, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_mine.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_mine.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                    i = 0;
                    comandopsg = new NpgsqlCommand(sentenciaforeign, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_foreign.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_foreign.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
                if (tipo == 1)
                {
                    dgv_mine.Columns.Add("TIPO","TIPO");
                    dgv_foreign.Columns.Add("TIPO", "TIPO");
                    rellenar_tipo_s();
                }
                dgv_mine.AutoResizeColumns();
                dgv_foreign.AutoResizeColumns();
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }



        private void Sinónimos_Load(object sender, EventArgs e)
        {
            Cargar_sinseqproc(frm_login.tipo);
        }

        private void dgv_mine_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Editando...";
                disable_controls();
                if ((!lbl_insertar.Visible) || ((e.RowIndex + 2 <= dgv_mine.Rows.Count) && (!dgv_mine.AllowUserToAddRows)) || ((e.RowIndex + 3 <= dgv_mine.Rows.Count) && (dgv_mine.AllowUserToAddRows)))
                {
                    if (frm_login.tipo == 1)
                    {
                        if (e.ColumnIndex == 4)
                        {
                            if (frm_login.oracle)
                            {
                                //Cuando tenga el tipo cambiar
                                int incremento_antiguo = Convert.ToInt32(dgv_mine.Rows[e.RowIndex].Cells[5].Value);
                                string sequence_name = dgv_mine.Rows[e.RowIndex].Cells[0].Value.ToString();
                                string sentencia = "ALTER SEQUENCE " + sequence_name + " INCREMENT BY " + (Convert.ToInt32(dgv_mine.Rows[e.RowIndex].Cells[e.ColumnIndex].Value) - last_value);
                                comando = new OracleCommand(sentencia, frm_login.con);
                                comando.ExecuteNonQuery();
                                sentencia = "select " + sequence_name + ".nextval from dual";
                                comando = new OracleCommand(sentencia, frm_login.con);
                                comando.ExecuteReader();
                                sentencia = "ALTER SEQUENCE " + dgv_mine.Rows[e.RowIndex].Cells[0].Value + " INCREMENT BY " + incremento_antiguo;
                                comando = new OracleCommand(sentencia, frm_login.con);
                                comando.ExecuteNonQuery();
                                MessageBox.Show("Valor actual del secuence actualizado con éxito");
                            }
                            else
                            {

                            }
                        }
                    }
                }
                else
                {
                    dgv_mine.AllowUserToAddRows = false;
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }

        }

        private void dgv_mine_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {

                if (e.RowIndex + 2 > dgv_mine.Rows.Count)
                {
                    lbl_insertar.Visible = true;
                }
                else
                {
                    last_value = Convert.ToInt32(dgv_mine.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        private void lbl_insertar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Insertando...";
                disable_controls();
                string sentencia;
                string tipo;
                int row = dgv_mine.Rows.Count-1;
                string nombre = dgv_mine.Rows[row].Cells[0].Value.ToString();
                //Cambiar el numero de celda cuando haya tipo
                string minoref = dgv_mine.Rows[row].Cells[2].Value.ToString();
                if (frm_login.oracle)
                {
                    if (frm_login.tipo == 0)
                    {
                        tipo = "Sinónimo";
                        sentencia = "CREATE SYNONYM " + nombre + " FOR " + minoref;
                    }
                    else
                    {
                        string max = dgv_mine.Rows[row].Cells[3].Value.ToString();
                        string incremento = dgv_mine.Rows[row].Cells[5].Value.ToString();
                        tipo = "Sequence";
                        sentencia = "CREATE SEQUENCE " + nombre + " INCREMENT BY " + incremento + " MAXVALUE " + max + " MINVALUE " + minoref;
                    }
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    string max = dgv_mine.Rows[row].Cells[3].Value.ToString();
                    string incremento = dgv_mine.Rows[row].Cells[4].Value.ToString();
                    tipo = "Sequence";
                    sentencia = "CREATE SEQUENCE " + nombre + " INCREMENT BY " + incremento + " MINVALUE " + minoref + " MAXVALUE " + max;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show(tipo + " creado con éxito");
                dgv_mine.AllowUserToAddRows = true;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }



        private void dgv_mine_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Eliminando...";
                disable_controls();
                string sentencia;
                string tipo;
                string nombre = dgv_mine.Rows[e.Row.Index].Cells[0].Value.ToString();
                if (frm_login.oracle)
                {
                    if (frm_login.tipo == 0)
                    {
                        tipo = "Sinónimo";
                        sentencia = "DROP SYNONYM " + nombre;
                    }
                    else
                    {
                        tipo = "Sequence";
                        sentencia = "DROP SEQUENCE " + nombre;
                    }
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    tipo = "Sequence";
                    sentencia = "DROP SEQUENCE " + nombre;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show(tipo + " eliminado con éxito");
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void btn_cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void llb_actualizar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Cargar_sinseqproc(frm_login.tipo);
        }

        }
}
